package com.linzm.leetcode.mid.exercises1_20230114;

/**
 * @Author zimingl
 * @Date 2023/1/15 20:49
 * @Description:  一次编辑
 */
public class Demo1 {
    /**
     * 字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑。
     */
    public static void main(String[] args) {
        // a ab 插入 ab ac 替换 abc ab 删除
        String first = "pale", second = "ple";
        Demo1 demo1 = new Demo1();
        boolean bool = demo1.oneEditAway2(first, second);
        System.out.println(bool);
    }
    private boolean oneEditAway(String first, String second) {
        // 长度差大于2
        if (Math.abs(first.length() - second.length()) > 1) {
            return false;
        }
        int count = 0;
        // 长度相等情况下
        if (first.length() == second.length()) {
            for (int i = 0, j = 0; i < first.length(); i++) {
                if (first.charAt(i) != second.charAt(j)) {
                    count++;
                }
                j++;
            }
        }
        if (count > 1) {
            return false;
        }
        if (count == 1) {
            return true;
        }
        // 长度相等差1情况下
        if (first.equals("") || second.equals("")) {
            return true;
        }
        if (first.length() < second.length()) {
            String str = first;
            first = second;
            second = str;
        }
        for (int i = 0, j = 0; i < first.length(); i++) {
            if (first.charAt(i) != second.charAt(j)) {
                count++;
            } else {
                j++;
            }
            if (j == second.length()) {
                return true;
            }
            if (count > 1) {
                return false;
            }
        }
        return true;
    }

    private boolean oneEditAway2(String first, String second) {
        int p1 = 0;
        int q1 = first.length() - 1;
        int p2 = 0;
        int q2 = second.length() - 1;
        while (p1 <= q1 && p2 <= q2) {
            if (first.charAt(p1) == second.charAt(p2)) {
                ++p1;
                ++p2;
                continue;
            }
            if (first.charAt(q1) == second.charAt(q2)) {
                --q1;
                --q2;
            } else {
                break;
            }
        }
        return q1 - p1 + q2 - p2 <= 0 && Math.abs(p1 - p2) <= 1 && Math.abs(q1 - q2) <= 1;
    }
}
